package CyclicBarrier_6;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class 复杂任务协调_数据ETL处理 {
    public static void main(String[] args) {
        final int WORKER_COUNT = 3;
        final CyclicBarrier extractBarrier = new CyclicBarrier(WORKER_COUNT);
        final CyclicBarrier transformBarrier = new CyclicBarrier(WORKER_COUNT);
        final CyclicBarrier loadBarrier = new CyclicBarrier(WORKER_COUNT, new Runnable() {
            public void run() {
                System.out.println("所有数据ETL处理完成");
            }
        });

        // 数据提取工作者
        new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("数据提取开始...");
                    Thread.sleep(1500); // 模拟提取时间
                    System.out.println("数据提取完成");
                    extractBarrier.await();

                    System.out.println("等待数据转换完成...");
                    transformBarrier.await();

                    System.out.println("数据加载开始...");
                    Thread.sleep(800); // 模拟加载时间
                    System.out.println("数据加载完成");
                    loadBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 数据转换工作者
        new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("等待数据提取完成...");
                    extractBarrier.await();

                    System.out.println("数据转换开始...");
                    Thread.sleep(2000); // 模拟转换时间
                    System.out.println("数据转换完成");
                    transformBarrier.await();

                    System.out.println("等待数据加载完成...");
                    loadBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        // 数据验证工作者
        new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("等待数据提取完成...");
                    extractBarrier.await();

                    System.out.println("数据验证开始...");
                    Thread.sleep(1200); // 模拟验证时间
                    System.out.println("数据验证完成");
                    transformBarrier.await();

                    System.out.println("等待数据加载完成...");
                    loadBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}